package com.drug.mingkang.service.impl;

import com.drug.mingkang.model.HqMarketdetail;
import com.drug.mingkang.mapper.HqMarketdetailMapper;
import com.drug.mingkang.model.vo.EChartsVo;
import com.drug.mingkang.model.vo.HqMarketDetailVo;
import com.drug.mingkang.model.vo.SalesProfitVo;
import com.drug.mingkang.model.vo.SalesStatisticsVo;
import com.drug.mingkang.service.HqMarketdetailService;
import com.drug.mingkang.utils.Line;
import com.drug.mingkang.utils.Tools;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 总公司销售明细(HqMarketdetail)表服务实现类
 *
 * @author wenchangjian
 * @since 2020-08-11 12:00:13
 */
@Service("hqMarketdetailService")
public class HqMarketdetailServiceImpl implements HqMarketdetailService {
    @Resource
    private HqMarketdetailMapper hqMarketdetailMapper;

    @Resource
    private Tools tools;
    /**
     * 通过ID查询单条数据
     *
     * @param marketdetailId 主键
     * @return 实例对象
     */
    @Override
    public HqMarketdetail queryById(String marketdetailId) {
        return this.hqMarketdetailMapper.queryById(marketdetailId);
    }

    /**
     * 查询多条数据
     *
     * @param hqMarketDetailVo vo
     * @return 对象列表
     */
    @Override
    public Map<String, Object> queryAllByLimit(HqMarketDetailVo hqMarketDetailVo) {
        return tools.limit(this.hqMarketdetailMapper.queryAllByLimit(hqMarketDetailVo), this.hqMarketdetailMapper.count(hqMarketDetailVo));
    }

    /**
     * 新增数据
     *
     * @param hqMarketdetail 实例对象
     * @return 实例对象
     */
    @Override
    public HqMarketdetail insert(HqMarketdetail hqMarketdetail) {
        this.hqMarketdetailMapper.insert(hqMarketdetail);
        return hqMarketdetail;
    }

    /**
     * 修改数据
     *
     * @param hqMarketdetail 实例对象
     * @return 实例对象
     */
    @Override
    public HqMarketdetail update(HqMarketdetail hqMarketdetail) {
        this.hqMarketdetailMapper.update(hqMarketdetail);
        return this.queryById(hqMarketdetail.getMarketdetailId());
    }

    /**
     * 通过主键删除数据
     *
     * @param marketdetailId 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(String marketdetailId) {
        return this.hqMarketdetailMapper.deleteById(marketdetailId) > 0;
    }

    /**
     * 根据年份查询总公司销售前十销售量药品
     * @param page        页
     * @param limit         条
     * @param year 年份
     * @return
     */
    @Override
    public List<EChartsVo> selectMarketFrontShi(Integer page, Integer limit, String year) {
        return this.hqMarketdetailMapper.selectMarketFrontShi((page-1)*limit,limit,year);
    }

    /**
     * 根据年份查询总公司 销售总金额与成本总金额对比图 与  销售总金额及毛利对比图 (实现销售量折线统计图)
     * @param salesYear 年份
     * @return
     */
    @Override
    public Map<String, Object> findTotalCostAllPriceAndSalesProfit(String salesYear) {
        //创建一个月份String型数组
        String[] month = new String[]{"1","2","3","4","5","6","7","8","9","10","11","12"};
        //创建一个销售总金额每月long型数组
        Long[] totalSales = new Long[12];
        //创建一个销售总成本每月long型数组
        Long[] cost = new Long[12];
        //创建一个销售毛利每月long型数组
        Long[] grossMargin = new Long[12];
        //查询总公司销售里面的查询一年内每月销售数据的方法
        List<SalesProfitVo> totalCostAllPriceAndSalesProfit = this.hqMarketdetailMapper.findTotalCostAllPriceAndSalesProfit(salesYear);
        //遍历12个月
        for (int i = 0; i < month.length; i++) {
            //遍历一年内每月销售数据
            for (SalesProfitVo salesProfitVo : totalCostAllPriceAndSalesProfit) {
                //判断是否有这个月的销售
                if(salesProfitVo.getMonth().equals(month[i])){
                    totalSales[i] = salesProfitVo.getTotalSales();
                    cost[i] = salesProfitVo.getCost();
                    grossMargin[i] = salesProfitVo.getGrossMargin();
                    break;
                }else{
                    totalSales[i] = Long.valueOf(0);
                    cost[i] = Long.valueOf(0);
                    grossMargin[i] = Long.valueOf(0);
                }
            }
            //没有数据返回[0,0,0,0]
            if(totalCostAllPriceAndSalesProfit.size()<=0){
                totalSales[i] = Long.valueOf(0);
                cost[i] = Long.valueOf(0);
                grossMargin[i] = Long.valueOf(0);
            }
        }
        //创建一个map集合
        Map<String, Object> map = new ConcurrentHashMap<String, Object>();
        //销售总金额
        map.put("totalSales",totalSales);
        //销售总成本
        map.put("cost", cost);
        //销售毛利
        map.put("grossMargin",grossMargin);
        return map;
    }

    /**
     * 根据年份查询总(分)公司 销售量数排行表(每年每月的总销售量)
     * @param salesStatisticsVo 销售量数排行表(每年每月的总销售量) Vo
     * @param status 状态（1 实现销量折线统计图的方法 2 实现销售排行统计表）
     * @return
     */
    @Override
    public Map<String, Object> findAllSalesStatistics(SalesStatisticsVo salesStatisticsVo, String status) {
        //根据年份查询总公司销售(每年每月的总销售量)(每月药品销售数量)
        List<SalesStatisticsVo> allSalesStatistics = this.hqMarketdetailMapper.findAllSalesStatistics(salesStatisticsVo);
        //根据年份查询总公司销售药品总条数
        int count = this.hqMarketdetailMapper.findAllSalesStatisticsCount(salesStatisticsVo);
        //判断，如果num=1，则调用实现销量折线统计图的方法，如果为2，则调用实现销售排行统计表的方法
        if("1".equals(status)){
            //调用实现销量排行折线统计图的方法，传入总公司销售集合和销售量前十药品集合
            return salesDrugAllBeforeTen(allSalesStatistics);
        }else{
            //调用实现销售排行统计表的方法，传入总公司销售集合和总公司销售药品总条数
            return tools.limit(allSalesStatistics,count);
        }
    }

    /**
     * 实现销量排行折线统计图
     * @param allSalesStatistics    总公司销售(每年每月的总销售量)(每月药品销售数量)
     * @return  Map
     */
    private Map<String, Object> salesDrugAllBeforeTen(List<SalesStatisticsVo> allSalesStatistics) {
        //创建一个list集合
        List<Line> listLine = new ArrayList<Line>();
        //判断集合是否为空
        if(allSalesStatistics.size()<=0){
            //循环遍历list集和
            for(int i=0;i<10;i++){
                //创建一个int型数组
                int[] num = new int[12];
                //创建一个折线统计图模型
                Line line = new Line();
                //给折线统计图模型赋值
                line.setName("");
                line.setStack("销量");
                line.setType("line");
                //给1~12月赋值
                for(int j=0;j<12;j++){
                    //给num数组赋值
                    num[j] = 0;
                }
                //给折线统计图模型里面的data数组赋值
                line.setData(num);
                //将折线统计图模型添加到listLine集合中
                listLine.add(line);
            }
        }else{
            for (int i = 0; i < allSalesStatistics.size(); i++) {
                //创建一个int型数组（方便存每月销量）
                int[] num = new int[12];
                //创建一个折线统计图模型
                Line line = new Line();
                //给折线统计图模型赋值
                line.setName(allSalesStatistics.get(i).getDrugName());
                line.setStack("销量");
                line.setType("line");
                //月份赋值
                num[0] = allSalesStatistics.get(i).getOneMonth();
                num[1] = allSalesStatistics.get(i).getTwoMonth();
                num[2] = allSalesStatistics.get(i).getThreeMonth();
                num[3] = allSalesStatistics.get(i).getFourMonth();
                num[4] = allSalesStatistics.get(i).getFiveMonth();
                num[5] = allSalesStatistics.get(i).getSixMonth();
                num[6] = allSalesStatistics.get(i).getSevenMonth();
                num[7] = allSalesStatistics.get(i).getEightMonth();
                num[8] = allSalesStatistics.get(i).getNineMonth();
                num[9] = allSalesStatistics.get(i).getTenMonth();
                num[10] = allSalesStatistics.get(i).getElevenMonth();
                num[11] = allSalesStatistics.get(i).getTwelveMonth();
                //给折线统计图模型里面的data数组赋值
                line.setData(num);
                //将折线统计图模型添加到listLine集合中
                listLine.add(line);
            }

        }
        String[] drugAllName = null;
        //前十药品名称
        if(allSalesStatistics.size()<=0){
            drugAllName =new String[10];
            for (int i = 0; i < 10; i++) {
                drugAllName[i] = "";
            }
        }else{
            drugAllName =new String[allSalesStatistics.size()];
            for (int i = 0; i < allSalesStatistics.size(); i++) {
                drugAllName[i] = allSalesStatistics.get(i).getDrugName();
            }
        }
        //创建一个map集合
        Map<String,Object> map = new HashMap<String,Object>();
        //前十药品数组
        map.put("drugAllName", drugAllName);
        map.put("list", listLine);
        return map;
    }
}